/*双向链表链式存储
 *
 */

#ifndef DOUBLYLINKEDLIST_H
#define DOUBLYLINKEDLIST_H

#include <stddef.h>

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) {if(p){free(p);p=NULL;}}
#endif

typedef struct DoublyLinkedListNode{
    int data;
    DoublyLinkedListNode *pre;
    DoublyLinkedListNode *next;
    DoublyLinkedListNode():data(-1),pre(NULL),next(NULL){}
}DLLNode,*PNode;

//测试函数
void DoublyLinkedListNodeTest();

//1 初始化头结点
bool InitList(PNode *L);
//2

//3 获取长度
int Length(PNode L);
//4 获取第i个元素的数据，e返回
bool GetElem(PNode L,int i,int *data);
//5 返回第一个与e值相同的节点的位置
int LocateElem(PNode L,int data);
//6 在第i个位置插入新数据
bool Insert(PNode L,int i,int data);
//7 删除第i个元素，用e返回其值
bool Delete(PNode L,int i,int *data);
//8 依次输出链表每个元素
void Traverse(PNode L);
//9 头插法,创建n个元素
void CreateHead(PNode L,int n);
//10 尾插法
void CreateTail(PNode L,int n);
//11 销毁
int Destroty(PNode *L);

#endif // DOUBLYLINKEDLIST_H
